import axios from 'axios'

const http = axios.create({
  baseURL: '',
  timeout: 6000,
  headers: {
    'X-Custom-Header': 'foobar',
  },
  timeoutErrorMessage: '请求超时',
})

http.interceptors.request.use(
  function (config) {
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },

  function (error) {
    return Promise.reject(error)
  },
)

http.interceptors.response.use(
  function (response) {
    return response
  },

  async function (error) {
    const originalRequest = error.config
    // 判断是否是 token 超时（401 状态码）且之前没有重试过
    if (error.response && error.response.status === 401 && !originalRequest._retry) {
      originalRequest._retry = true
      try {
        // 调用刷新 token 的函数，这里假设返回一个 Promise，成功后获取新的 token
        const newToken = await refreshToken()
        localStorage.setItem('token', newToken)
        originalRequest.headers.Authorization = `Bearer ${newToken}`
        // 重新发送原始请求
        return http(originalRequest)
      } catch (refreshError) {
        // 如果刷新 token 失败，进行相应处理，比如清除本地存储的 token，跳转到登录页面等
        localStorage.removeItem('token')
        window.location.href = '/login'
        return Promise.reject(refreshError)
      }
    }
    return Promise.reject(error)
  },
)
function refreshToken() {
  return new Promise((resolve, reject) => {
    // 这里可以使用 axios 发送请求到后端的刷新 token 接口，例如：
    axios
      .post('/refresh-token', {
        // 根据后端要求传递必要的数据，比如旧的 token 等
        oldToken: localStorage.getItem('token')
      })
      .then((response) => {
        resolve(response.data.newToken)
      })
      .catch((error) => {
        reject(error)
      })
  })
}

export default http
